La libreria grafica ggplot2

ggplot2 è sicuramente la libreria che meglio permette di visualizzare le informazioni contenute nel dataset, ma la sua sintassi può richiedere un po’ di tempo per comprendere appieno le sue potenzialità.

Dopo l’installazione:

install.packages(ggplot2)

si può procedere con il caricamento della libreria nell’ambiente di lavoro.

library(ggplot2)

Quando si utilizza la funzione ggplot(), i punti chiave da capire sono:

  • I grafici in ggplot possono essere definiti solo sui dataframe. Le variabili del grafico (la variabile x, la variabile y, e le variabili che definiscono il colore o la dimensione dei punti) sono dette estetiche, e sono dichiarate utilizzando l’opzione aes()

  • La funzione ggplot() deve contenere il nome del dataframe e l’estetica.

  • La funzione ggplot() crea l’oggetto grafico e da sola non produce nessuna visualizzazione; le visualizzazioni sono prodotte dai layers.

Per questo tutorial utilizziamo il dataset wine contenuta nella libreria rattle.data

install.packages("rattle.data")
library(rattle.data)
data("wine")

Procediamo utilizzando la funzione specificando il dataset e l’estetitica. Un punto importante è che il nome delle colonne da utilizzare possono essere specificate senza l’utilizzo delle virgolette.

ggplot(wine, aes(x= Magnesium, y=Flavanoids ))

Il codice utilizzato inizializza il grafico visualizzando il background, il primo layer.

Sono i layers successivi che visualizzano le informazioni specificando gli oggetti geometrici e vengono aggiunti tramite l’operatore + seguiti da una funzione del tipo geom_..... Esempi di layers sono geom_point() (visualizza un grafico a dispersione) o geom_line() (visualizza un grafico a linee).

I layers possono assumere diversi argomenti che sono specifici del tipo di grafico che si vuole utilizzare.

ggplot(wine, aes(x= Magnesium, y=Flavanoids )) + geom_point()

La parte estetica, aes() accetta oltre gli argomenti x e y anche colour e size

ggplot(wine, aes(x= Magnesium, y=Flavanoids,colour=Hue,size=Proline ))  + geom_point()

Personalizzazione del grafico

Per aggiungere il titolo e l’etichette agli assi usiamo il layer labs() i cui argomenti sono assegnati ai diversi elementi grafici:

  • x,y (specificano l’etichette degli assi)
  • title (specifica il titolo del grafico)
  • subtitle (specifica il sottotitolo)
  • caption (specifica la caption)
ggplot(wine, aes(x= Magnesium, y=Flavanoids,colour=Hue,size=Proline ))  +
  geom_point() + 
  labs(x="Magnesium", 
       y="Flavanoids", 
       title = "Wine data set",
       subtitle = "Scatter plot",
       caption = "Data from library rattle.data") 

E’ possibile personalizzare il tema utilizzzando uno dei seguenti argomenti:

  • theme_gray()
  • theme_bw()
  • theme_classic()
  • theme_dark()
  • theme_gray()
  • theme_grey()
  • theme_light()
  • theme_linedraw()
  • theme_minimal()

L’esempio successivo fa riferimento al tema theme_minimal()

ggplot(wine, aes(x= Magnesium, y=Flavanoids,colour=Hue,size=Proline ))  +
  geom_point() + 
  labs(x="Magnesium", y="Flavanoids", 
       title = "Wine data set",
       subtitle = "Scatter plot",
       caption = "Data from library rattle.data") +
  theme_minimal()

Maggiori temi si possono utilizzare grazie alla libreria ggthemes.

Visualizzazione con ggplot2

Visualizzazione della distribuzione Univarita

La distribuzione di frequenza è ottenuta tramite la visualizzazione di un istogramma. Il primo passo per costruire di una distribuzione di frequenza dei dati è quello di dividere il range di variabilità della variabile considerata in una serie di intervalli più piccoli (bin). Questo metodo è chiamato binning e prevede la discretizzazione di una variabile continua. Per ciascun bin vengono conteggiati il numero di valori che rientrano in quell’intervallo.

Generalmente, gli istogrammi sono uno dei modi migliori modi per visualizzare rapidamente le caratteristiche di una variabile. Con il parametro binwidth si specifica la largezza del bin:

ggplot(wine, aes(x=Alcohol)) + geom_histogram(binwidth = 0.5)

Un modo alternativo per la visualizzazione della distribuzione è il grafico di densità. Il grafico densità visualizza la funzione di probabilità. Il grafico densità è una versione smussata dell’istogramma e si ottiene con l’opzione geom_density()

ggplot(wine, aes(x=Alcohol)) + geom_density() 

Nel prossimo grafico sovrapponiamo, l’istogramma con il grafico densità. Per permettere una sovrapposizione nella stessa scala di assi (istrogramma fa riferimento la numero di elementi di ciscun bin, la densità ad una probabilità), l’istogramma sarà calcolato tramite la densità anzichè il conteggio utilizzando l’opzione ..density...

ggplot(wine, aes(x=Alcohol)) + geom_density() + 
  geom_histogram(aes(y =..density..),binwidth = 0.5,alpha=0.2) 

Se si considerera invece una variabile categorica, la frequenza è visualizzabile tramite il layer geom_bar

ggplot(wine, aes(Type)) + geom_bar()

Nel codice precedente, l’argomento geom_bar ha utilizzato il valore di default stat="bin", in questo caso l’altezza rappresenta il conteggio dei casi di ciascuna categoria. Nel caso si volesse plottare il valore di un’osservazione si deve utilizzare l’opzione stat = "identity" come mostrato nel grafico successivo:

ggplot(wine[1:5,], aes(x=1:5, y=Alcohol)) + geom_bar(stat="identity") 

Il boxplot è un ulteriore metodo per visualizzare le caratteristiche statistiche di una distribuzione. Il layer utilizzato è geom_boxplot() mentre la variabile che si desidera visualizzare deve essere attribuita a y.

ggplot(wine, aes(x="Alcohol", y=Alcohol)) + geom_boxplot()

Distribuzione bivariata

Per plottare la densità bidimensionale di due variabili continue utilizziamo il layer geom_density2d()

ggplot(wine, aes(x=Alcohol,y=Ash))+ geom_density2d() +geom_point() 

Un boxplot può essere utilizzato per confrontare la distribuzione di una variabile abbinata ad una variabile categorica. La variabile categorica deve essere specificata nelle x mentre la variabile continua nelle y. Nel codice successivo, al layer del boxplot viene sovrapposto il layer geom_jitter() che a differenza di geom_point() cerca di separare i punti che si sovrappongono.

ggplot(wine, aes(x=Type,y=Proline))  + geom_boxplot() + geom_jitter()

Nel prossimo esempio, la variabile categorica è anche associata all’asse estetico colour

ggplot(wine, aes(x=Type,y=Proline,colour=Type))  + geom_boxplot() + geom_jitter()

Alternativativamente, le distribuzioni delle tre categorie possono essere visualizzate tramite il layer densità. In questo caso la variabile continua investigata deve essere specificata in x e la variabile categorica tramite l’asse estetico fill (alternativa a colour). L’opzione alpha determina la trasparenza delle superfici:

ggplot(wine, aes(x=Proline,fill=Type))  + geom_density(alpha=.3)

Visualizzazione bivariata

Per plottare grafici dispersione si utilizza il layer geom_point() o in alternativa il layer geom_jitter().

ggplot(wine, aes(x=Alcohol,y=Proline)) + geom_jitter()

E’ possibile plottare la linea di tendenza con il layer geom_smooth() impostando la seguente opzione method = lm. La parte grigia rappresenta l’intervallo di confidenza che per default è fissato al 95%.

ggplot(wine, aes(x=Alcohol,y=Proline)) + geom_jitter() +  geom_smooth(method = lm)

Con l’opzione geom_smooth(method = loess) viene aggiunta una curva interpolante (LOESS, o LOWESS, locally weighted scatterplot smoothing ).

ggplot(wine, aes(x=Alcohol,y=Proline)) + geom_jitter() +  geom_smooth(method = loess)

Possiamo aggiungere un’etichetta ai dati con l’argomento label, nell’esempio utilizziamo come etichetta un numero progessivo che creiamo sfruttando la funzione sequenza 1:178

ggplot(wine, aes(x=Alcohol,y=Proline,label=1:178)) + 
  geom_jitter(size=0.2) +  
  geom_smooth(method = lm) +
  geom_text()

Nell’esempio, utilizziamo l’asse estetico colour assegnando la variabile categorica Type per visualizzare i diversi gruppi.

ggplot(wine, aes(x=Alcohol,y=Proline,label=1:178)) + 
  geom_jitter(size=0.2) +  
  geom_smooth(method = lm) + 
  geom_text(aes(colour=Type))

Per migliorare la rappresentazione di testo si puà far uso della funzione geom_text_repel() dal pachetto ggrepel.

Visualizzazione interattiva con la libreria Plotly

Un’altra caratteristica molto interessante di ggplot2 è il suo collegamento con la libreria per la visualizzazione interattiva plotly.

install.packages("plotly")

Per ottenere una visualizzazione interattiva, basta usara la funzione ggplotly() sull’oggetto grafico creato con la funzione ggplot. Per facilitare la scrittura del codice è utile salvare l’oggetto creato da ggplot.

library(plotly)

 
p <-ggplot(wine, aes(x= Magnesium, y=Flavanoids,colour=Type, size=Proline )) + geom_point(alpha=0.5) + theme_bw()
 
ggplotly(p)

Letture di Approfondimento